Глава 9

Переменные и типы CFML

В предыдущих главах мы уже сталкивались с применением переменных, а в данной главе рассмотрим более подробно возможности использования переменных в ColdFusion. Но, для начала, познакомимся с понятием типов данных и допустимыми типами данных в ColdFusion.

Типы данных

Тип — это классификация, основанная на содержимом и индивидуальности. Тип определяет свойства выражения или переменной таким образом, что вы можете предсказать ее поведение.

В ColdFusion существуют следующие основные типы данных:

Кроме того, в ColdFusion доступны несколько более сложные типы:

Описание типов данных приведено в табл. 9.1.

Таблица 9.1. Описание типов данных

Типы

Описание

Integer

Целое число. Может принимать значения от —2147483648 до


2147483647

Real







Числовые данные с плавающей точкой. Тип предназначен для хра-

нения чисел. Всякий раз, выполняя математические операции, вы

имеете дело с той или иной разновидностью числовых значений

Диапазон чисел ColdFusion— приблизительно от -1300 до 1300. Макси-

мальное число цифр после запятой — 12. Например, 3,14159265359.

ColdFusion поддерживает представление чисел в экспоненциальной

форме, например, 5Е10

String

Символы. Текст, заключенный в одинарные или двойные кавычки.


Максимальная длина ограничена количеством доступной памяти в


ColdFusion Server

Boolean

Логический тип — результат логического действия. Возможные зна-


чения: True (Истина) или False (Ложь).


Числовой эквивалент True— 1. Числовой эквивалент False— 0.


Символьный эквивалент True— "Yes". Символьный эквивалент


False — "No"

Date

Дата и время. Идентифицируют дату и время, где минимальное


значение года может быть 100, а максимальное — 9999. Если ника-


кая часть времени не определена, время устанавливается в


12:00аm.


Вы можете также непосредственно задавать дату в любом из сле-


дующих форматов:


• "June 01, 1970"


• "Jim 01, 1970"


• "Jun. 01, 1970"


• "06/01/70"


• "1970-01-06"

Time

Вы можете непосредственно задавать дату и время в любом из


следующих форматов:


• "June 01, 197002:34:12"


• "June 01,19702:34a"


• "June 01, 1970 2:34am"


• "June 01,1 970 02:34am"


• "June 01, 19702am"


Точность — до секунды

 

Типы

Описание

List

Списки — специальный символьный тип, составленный из элемен-


тов, отделенных разделителями. Допускается самостоятельное оп-


ределение разделителя, который может состоять как из одного, так и из нескольких символов. По умолчанию в качестве разделителя принимается запятая (,). Разделители перед первым элементом и


после последнего элемента игнорируются.


Структура списков плоская, т. е. списки не могут быть вложены друг в друга. Также, списки не могут содержать никакие "пустые" элементы. Однако список может быть пуст, в этом случае он эквива-


лентен пустому значению — ""

Structure

Вы можете использовать структуры, чтобы создавать и поддерживать пары ключевых значений, обращаться к связанным символьным значениям как к общности, а не как к индивидуальным значениям, или формировать ассоциативные массивы

Array

Массивы — это группы переменных одного типа, доступ к которым осуществляется с помощью общего имени. Хотя функция ArrayNew только


поддерживает создание массивов, до третьей размерности, массив не имеет предела на свой размер или максимальное значение.


Элементы записываются в массив следующим образом:


<CFSET MyNewArray = ArrayNew (1)>


<CFSET MyNewArray [1] = "Anjuta">

Query

В ColdFusion запросы могут быть объявлены как объекты и назначены в качестве переменной запроса:


<CFQUERY NAME=MyNewQuery


DATASOURCE=Cruise


SELECT * FROM TICKET


</CFQUERY>


<CFSET MySecondQuery = MyNewQuery>


В данном случае (в отличие от того же самого действия с массивами) запрос не скопирован. Вместо этого обе переменные указывают на набор записей данных так, что если вы производили изменения в таблице, упомянутой в запросе, первоначальный запрос и


запрос MySecondQuery отразят эти изменения.


Запросы и переменные не могут одновременно иметь одинаковые имена в пределах одной Web-страницы

 

Типы

Описание

COM object

СОМ-объекты — невмзуапьные компоненты, инкапсулирующие определенные функциональные возможности. Примерами СОМ-объектов могут служить элементы ActiveX, OCX, CORBA и ADO-объекты.

СОМ-объекты обычно содержат методы, подобно функциям, которые можно использовать, чтобы выполнить некоторые действия:

<CFSET objExcelChart = objCharts . Add ( ) >

СОМ-объекты также обычно характеризуются свойствами. Вы можете считывать и записывать свойства объектов, используя ColdFusion-переменные:

<CFSET objExcelChart. Туре = -4100>

 

Переменные

Переменная — это один из элементов хранения информации. Переменные в CFML для хранения данных размещаются в контейнерах, к которым можно обратиться по имени. Это позволяет разрабатывать программы, содержащие переменные, с достаточно наглядным кодом, т. к. вместо неструктурированных переменных программа использует имена, которые разъясняют назначение данных.

Переменные в ColdFusion имеют определенные области действия и назначение и по этим признакам относятся к определенной категории. Эти категории, отражающие префикс, который может быть добавлен к имени переменной, представлены в табл. 9.2.

Таблица 9.2. Описание областей действия переменных

Префикс

Описание

Local URL

CGI Cookie Form.

Request

Локальные переменные, создаются с помощью тегов <CFSET>

ИЛИ <CFPARAM>

Переменные, отражающие параметры, добавленные к URL-адресу

Переменные, отражающие CGI-переменные окружения Переменные, отражающие cookies, передаваемые браузеру

Переменные, отражающие значения полей формы, переданные в текущую страницу

Переменные, отражающие значения после обработки запросов на странице

 

Префикс

Описание

Caller

Переменные источников вызова; предназначены для переменных из шаблонов при указании пользовательских тегов ColdFusion

Attributes

Переменные атрибутов пользовательских тегов

Client

Клиентские переменные

Session

Переменные сессий

Application

Переменные прикладных задач

Server

Серверные переменные

Имена переменных должны начаться с буквы, которая может сопровождаться любым цифровым символом или символом подчеркивания (_). Например, MyVariable_l и MyVariable_2, В ТО время как строка IstMyVariable! не может быть использована в качестве имени переменной.

Иногда имена переменных могут начинаться с приставки (префикса), которая непосредственно является отражением типа переменной. Приставка отделяется от имени переменной точкой (.), например, Form.FirstName. В этом случае приставка Form показывает, что переменная FirstName является полем формы, переданной в текущую Web-страницу.

К обязательным префиксам относительно Attributes, Request, Session, Application, Server и Caller (в случае использования пользовательских тегов).

При отсутствии использования приставки в других переменных, ColdFusion совершает поиск значений в следующем порядке:

  1. Local
  2. CGI
  3. File
  4. URL
  5. Form
  6. Cookie
  7. Client

Определение переменных

В ColdFusion для определения переменных существуют такие теги, как <CFSET> и <CFPARAM>. Здесь мы приведем несколько примеров определения переменных с использованием упомянутых тегов. Но обо всем по порядку.

Тег <CFSET>

Одним из вариантов определения переменной в ColdFusion является указание тега <CFSET>. Если переменная уже существует, она определяется повторно.

Синтаксис:

<CFSET имя_переменной = выражение>

Например, для определения переменной FirstName со значением "Anjuta" необходимо включить в текущую Web-страницу следующий код:

<CFSET FirstName="Anjuta">

В следующем примере создаем новый массив MyCruisesLine с перечислением круизов:

<CFSET MyCruisesLine = ArrayNew(1)>

<CFSET MyCruisesLine[1] = "1-hr Seaport Liberty">

<CFSET MyCruisesLine[2] = "2-hr Semi Circle">

<CFSET MyCruisesLine[3] = "3-hr Full Island">

<CFSET MyCruisesLine[4] = "2-hr Harbor Lights Evening">

<CFSET MyCruisesLine[5] = "Special Events">

И в заключение данного раздела представим пример для работы с СОМ-объектом. Здесь мы создаем СОМ-объект на основе приложения MS Excel с помощью тега <CFOBJECT>, а используя тег <CFSET>, определяем свойства и методы этого объекта:

<CFOBJECT ACTION="CREATE"

CLASS="Excel.Application"

NAME="objExcel"

TYPE="COM">

<CFSET objExcel.Visible = "False">

<CFSET objWorkBook = objExcel.Workbooks>

<CFSET objOpenedBook = objWorkBook.Add()>

<CFSET objWorkSheets = objExcel.WorkSheets>

<CFSET objWorkSheet = objWorkSheets.Add()>

<CFSET objRange = objExcel.Range("Al:A1")>

<CFSET objRange.value = "MyLineCruises">

<CFSET objWorkSheet.SaveAs("D:\Cruises.xls",Val(1))>

<CFSET objWorkBook.Close()>

<CFSET objExcel.Quit()>

<CFSET objExcel = "Nothing">

В результате данного примера из диапазона ячеек А1:А1, которому присваи-ваентся имя "MyLineCruises", создается файл MS Excel и сохраняется в каталоге D:\ с именем Cruises.xls.

Тег <CFPARAM>

Еще одним вариантом определения переменной в ColdFusion является использование тега <CFPARAM>, который также обеспечивает возможность указания типа данных и значения по умолчанию, в том числе может применяться для проверки существования переменной.

Синтаксис:

<CFPARAM NAME = "variable_name" TYPE = "data_type" DEFAULT = "default_value">

Имеются два способа использования тега <CFPARAM>, в зависимости от задачи:

Следующий пример показывает, как использовать тег <CFPARAM> для определения переменной, если она отсутствует:

<CFPARAM NAME="Form.Gender" DEFAULT="male">

Отметим также возможные варианты необязательного атрибута TYPE:

Например, определим переменную Moneyness с типом boolean:

<CFPARAM NAME="Moneyness" DEFAULT=True TYPE="boolean">

По умолчанию тип данных переменной принимает значение any.

CGI-переменные

CGI (Common Gateway Interface, стандартный интерфейс шлюза) является стандартом интерфейса связи внешней прикладной программы с информационным сервером типа HTTP или Web. В ColdFusion существует набор стандартных CGl-переменных окружения версии 1.1, которые можно использовать для диагностики запросов (request), сервера (server), посылающего запросы, и клиента (client), принимающего эти запросы. Описание переменных приведено в табл. 9.3—9.5.

Таблица 9.3. CGI-переменные запросов

Наименование

Описание

CGI . CONTENT LENGTH

Длина в байтах тела запроса

CGI. CONTENT TYPE

Тип тела запроса

CGI . PATH INFO

Дополнительная информация о пути, которую пере-


дал клиент

CGI . PATH_TRANSLATED

Сервер передает преобразованную версию PATH INFO, которая включает в себя путь, преобразованный из виртуального в физический

CGI. QUERY STRING

Строка запроса. Принимает значение при использовании метода GET и подобного

CGI.HTTP_REFERER

Ссылка на страницу при выполнении запроса. Принимает значение при использовании метода GET и подобного

CGI. REQUEST METHOD

Метод, который был использован для запроса. Для

HTTP ЭТО GET, POST, HEAD И Т. Д.

CGI. SCRIPT NAME

Виртуальный путь к шлюзу текущего запроса

 

Таблица 9.4. CGI-переменные диагностики сервера

Наименование

Описание

CGI.AUTH TYPE

CGI. GATEWAY INTERFACE CGI. REMOTE ADDR

Эта переменная определена в том случае, когда запрошенный ресурс требует аутентификации пользователя

Версия CGI-спецификации

IP-адрес удаленного хоста, производящего данный запрос

 

Наименование

Описание

CGI . REMOTE_HOST CGI.REMOTEJJSER

REMOTE I DENT

CGI . SERVER NAME CGI . SERVER PORT

CGI . SERVER PROTOCOL CGI . SERVER_SOFTWAR'E

Имя удаленного хоста, производящего запрос. Если сервер не имеет такой информации, он должен задать REMOTE ADDR, а это поле оставить не установленным

Переменная определена в том случае, когда запрошенный ресурс требует аутентификации пользователя

Если HTTP-сервер поддерживает идентификацию пользователя согласно RFC 931 , то переменная будет содержать имя пользователя, полученное от сервера

Имя хоста, на котором запущен сервер, DNS-имя или IP-адрес в том виде, в котором он представлен в URL

Номер порта, через который был послан запрос. По умолчанию HTTP-порт 80

Имя и версия информационного протокола

Название и версия информационного сервера, который отвечает на запрос и запускает шлюз

 

Таблица 9.5. CGI-переменные диагностики клиента

Наименование

Описание

CGI.CERT_ISSUER

Издатель сертификата

CGI. CLIENT CERT ENCODED

Полная информация о сертификате клиента в закодированном виде (Base-64 encoded)

CGI.CERT_SUBJECT

Субъект издательского сертификата

CGI. HTTP ACCEPT

Список MIME-типов, которые клиент может обработать, как задано в HTTP-заголовках

CGI. HTTP IF_MODIFIED SINCE

Переменная предоставляет возможность эффективного обновления информации локальных кэшей с минимумом передаваемой информации

CGI. HTTP USER AGENT

Информация о браузере, который использует клиент для посылки запроса

В следующем примере с помощью CGI-переменной HTTP_USER_AGENT мы распознаем тип браузера, и если этот браузер является встроенным в мобильный телефон, который поддерживает технологию WAP, тогда формируем соответствующий код, используя язык WML. В противном случае загружаем Web-страницу idx.cfm с кодом, "читаемым" обычными компьютерными браузерами:

<CFIF CGI.HTTP_USER_AGENT contains "wap"> <CFCONTENT TYPE="text/vnd.wap.wml"> <?xml version="1.0"?>

<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforuin.org/DTD/wml_l.l.xml">

<wml>

<card id="start" ontimer="idx.wml">

<timer value="l"/>

<p align="center"ximg src="logo.wbrup" alt="Welcome!"/>

<br/xi>One moment ...</i> </p> </card> </wml>

<CFELSE>

<META HTTP-EQUIV="Refresh" CONTENT="0;URL=idx.cfm"> </CFIF>

К этому примеру мы еще вернемся в главе 21.

Клиентские переменные

Клиентские переменные могут использоваться в таких целях, как сохранение параметров, характеризующих шрифт, цвет, стиль и расположение страницы, а также хранение значения счетчика и последнего времени посещения страницы, в конце концов, контроль результатов опросов, тестов, закупок в электронных магазинах и т. д.

В ColdFusion существует три возможных механизма хранения клиентских переменных.

Рис. 9.1. Установка жизненного цикла клиентской переменной для механизма хранения в реестре

За выбор механизма хранения клиентских переменных отвечает атрибут CLIENTSTORAGE тега <CFAPPLICATION>.

Атрибут CLIENTMANAGEMENT того же тега позволяет включать или отключать управление клиентскими переменными.

В следующем примере с помощью тега <CFPARAM> создадим клиентскую переменную Client.NameCruise CO значением по умолчанию "1-hr Seaport Liberty":

<CFPARAM NAME="Client.NameCruise" DEFAULT="1-hr Seaport Liberty">

Если учесть, что в нашем случае механизм хранения переменных не изменялся и принимает значение по умолчанию — Registry (Реестр), то и переменную следует искать в системном реестре. На рис. 9.2 показано окно Registry Editor (Редактор реестра) после выполнения примера создания клиентской переменной Client.NameCruise.

Как вы заметили, жизненный цикл клиентских переменных достаточно длительный, так что при необходимости принудительного удаления клиентской переменной можно воспользоваться функцией DeieteClientvariabie следующим образом:

<CFSET IsDeleteSuccessful=DeleteClientVariable("NameCruise")>

IsDeleteSuccessful = <CFOUTPUT>#IsDeleteSuccessful#</CFOUTPUT>

Рис. 9.2. Окно редактора реестра Registry Editor

В представленном примере первая строка кода позволяет удалить переменную NameCruise, а вторая строка отражает результат переменной IsDeleteSuccessful, где значение "Yes" указывает на удачное удаление переменной.
можно , кпримеру, воспользовавшись функцией GetClientVariablesList, отразить список клиентских переменных:

<CFOUTPUT>#GetClientVariablesList()#</CFOUTPUT>

В ColdFusion существуют встроенные клиентские переменные, приведенные в табл. 9.6.

Таблица 9.8. Встроенные клиентские переменные

Наименование

Описание

Client . CFID

Идентификатор для каждого клиента, который соединяется с сервером

Наименование

Описание

Client .CFTOKEN

 

Client . URLToken


Client .LastVisit Client. HitCount

 

 


Client . TimeCreated

Произвольно сгенерированный номер, являющийся уникальным идентификатором конкретного клиента

Комбинация значений CFID и CFTOKEN, разделенных символом & с указанием наименования переменных

Дата и время последнего посещения, сделанного клиентом

Количество запросов, выполненных к странице клиентом, идентифицированным под значениями переменных CFID

И CFTOKEN

Записывает дату и время, когда переменные CFID и CFTOKEN были созданы для данного клиента

Работа со встроенными клиентскими переменными возможна при включении атрибута CLIEJSITMANAGEMENT тега <CFAPPLICATION>. Для этого достаточно в конфигурационном файле приложения Application.cfm записать следующий код:

<CFAPPLICATION NAME="MyLineCruises"

ClIENTMANAGMENT="Yes">

Более подробно использование механизма хранения переменных с помощью базы данных и конфигурационного файла Application.cfm рассмотрим в главе 10.

Переменные сессий

Переменные сессии служат для единовременного фиксирования посещения Web-страницы. Сессия определяется индивидуальным пользователем, в результате чего каждый пользователь имеет отдельную сессию и конкретный набор переменных сессии. Сессия начинается при первом вхождении на Web-участок и формально заканчивается при завершении работы браузера. Таким образом, один пользователь может работать сразу с несколькими сессиями, предварительно запустив браузер необходимое количество раз. Мы говорим о формальном завершении сессии, т. к. сессия имеет период времени, по окончании которого при бездействии пользователя сессия завершается, а, следовательно, и жизненный цикл переменных прекращается. То есть зарегистрировались вы на одном из Web-участков, некоторое время поработали и, не закрывая ваш любимый браузер, отлучились от компьютера, например, ушли на обед. А через определенный промежуток времени сессия завершается. Приходите с обеда, пытаетесь совершить какие-либо действия в окне открытого браузера, но ничего не получается. Все дело в том, что переменные сессии, часть из которых могли отвечать за доступ к Web-участку, прекратили свое существование.

Переменные сессий могут использоваться в таких целях, как хранение параметров регистрации пользователя, хранение вычислений, основанных на информации из клиентских переменных, хранение временных результатов запросов к данным, в общем, контроль над всеми переменными, требующими сохранение только в течение единой сессии.

В ColdFusion жизненный цикл переменных сессий по умолчанию равен 20 минутам. Однако так же, как и с клиентскими переменными, имея доступ к Web-странице "ColdFusion Administrator", данное значение можно изменить (рис. 9.3).

Рис. 9.3. Страница "ColdFusion Administrator", раздел Memory Variables

Более того, данный период можно указать программным методом, все в том же пока мало известном конфигурационном файле приложения Application, cfm, используя атрибут SESSIONTIMEOUT все того же тега <CFAPPLICATION>.

Скажем, для указания периода жизни переменных сессий, равным 25 минутам, и включения управления этими переменными следует в конфигурационном файле приложения Application.cfm записать следующий код:

<CFAPPLICATION NAME="MyLineCruises"

SESSIONTIMEOUT="#createTimeSpan(0,0,25, 0)1" SESSIONMANAGEMENT="Yes">

Для примера объявим переменную сессии Login следующим образом:

<CFSET Session.Login = "true">

Надо отметить, что принудительное удаление той или иной переменной сессии возможно при вызове функций structDelete или structciear. Таким образом, осуществить удаление переменной Login можно следующим образом:

<CFLOCK TIMEOUT="30" SCOPE="Session" TYPE="Exclusive">

<CFSET StructDelete(Session, "Login")>

<CFIF IsDefined("Session.Login")>

Variable still exists. <CFELSE>

Variable is successfully removed! </CFIF> </CFLOCK>

В приведенном примере мы использовали блокировку посредством тега <CFLOCK>, что является правилом хорошего тона при работе в сети. Более подробно применение блокировок рассмотрим в главе 10.

В ColdFusion существуют встроенные переменные сессий, перечень которых приведен в табл. 9.7.

Таблица 9.7. Встроенные переменные сессий

Наименование

Описание

Session. CFID

 

Session. CFTOKEN

Session. URLToken


Session. SessionID

Идентификатор для каждого клиента, который соединяется с сервером

Произвольно сгенерированный номер, являющийся уникальным идентификатором конкретного клиента

Комбинация значений переменных CFID и CFTOKEN, разделенных символом & с указанием наименования переменных

Идентификатор сессии, представляющий комбинацию значений наименования приложения CFID и CFTOKEN, разделенных символом подчеркивания ( )

Работа со встроенными переменными сессий возможна при включении атрибута SESSIONMANAGEMENT тега <CFAPPLICATION>.

Переменные сессий хранятся в оперативной памяти сервера.

Переменные прикладных задач

Переменные прикладных задач (далее будем называть их прикладными переменными) связаны с единым приложением и доступны всем клиентам данного приложения. Прикладные переменные могут использоваться в таких целях, как хранение учета обращений к текущему приложению, хранение результатов запросов к данным, к которым могут обращаться все клиенты приложения, хранение наименований источников данных, а также хранение заголовка приложения и стандартных сообщений и т. д.

Для использования прикладных переменных необходимо создать конфигурационный файл с именем Application.cfm и добавить туда определение имени приложения, используя атрибут NAME тега <CFAPPLICATION>. Указанные определения в конфигурационном файле приложения распространяются на все прилегающие к этому файлу страницы приложения. То есть, загружая ту или иную страницу ColdFusion, система ищет файл Application.cfm вплоть до корневого каталога приложения и при первой удачной попытке содержимое найденного файла помещается в начало загруженной ColdFusion-страницы.

В ColdFusion жизненный цикл прикладных переменных по умолчанию равен 2-м дням. Однако, имея доступ к Web-странице "ColdFusion Administrator", данное значение можно изменить. И так же, как и с переменными сессий, период жизненного цикла можно указать программным методом, в конфигурационном файле приложения Application.cfm, используя атрибут APPLICATIONTIMEOUT тега <CFAPPLICATION>.

Например, для указания периода жизни прикладных переменных равным 4-м часам следует в конфигурационном файле приложения Application.cfm записать следующий код:

<CFAPPLICATION NAME="MyLineCruises"

APPLICATIONTIMEOUT="#createTimeSpan(0,4,0, 0)#" SESSIONMANAGEMENT="Yes">

Для примера объявляем прикладную переменную textFieidsize следующим образом:

<CFPARAM NAME="Application.textFieldSize" DEFAULT="25">

Следующий пример позволяет вывести список прикладных переменных с использованием тега <CFLOOP>, определив эти переменные в качестве коллекции:

<CFLOCK TIMEOUT="30" SCOPE="Application" TYPE="ReadOnly">

<CFLOOP COLLECTION=#Application# ITEM=itemID>

<CFOUTPUT>ID=#itemID# Value=#Application[itemID]#</CFOUTPUT><br>

</CFLOOP> </CFLOCK>

В" этом примере мы использовали блокировку прикладных переменных только на чтение.

Удаление переменных прикладных задач производится по аналогии с удалением переменных сессий. К примеру, для удаления ранее объявленной переменной textFieidSize можно использовать следующую конструкцию:

<CFLOCK TIMEOUT="30" SCOPE="Application" TYPE="Exclusive">

<CFSET StructDelete(Application, "textFieidSize")> </CFLOCK>

В качестве встроенных прикладных переменных в ColdFusion существует переменная Application.AppiicationName, принимающая значение атрибута NAME тега <CFAPPLICATION>, объявленного в конфигурационном файле Application.cfm.

Серверные переменные

Серверные переменные не привязаны к какому-либо приложению (application) или клиенту, а относятся непосредственно к ColdFusion Server, и по этой причине к ним можно обращаться всем клиентам или из разных приложений данного сервера. Эти переменные хранятся в оперативной памяти сервера до тех пор, пока тот не будет приостановлен.

Например, объявим серверную переменную CountuserActive с использованием тега <CFSET>:

<CFSET Server.CountuserActive = 0>

Удаление и просмотр серверных переменных осуществляется по аналогии с переменными сессий и переменными прикладных задач. Скажем, удаление серверной переменной CountuserActive можно осуществить следующим способом:

<CFLOCK TIMEOUT="30" SCOPE="Server" TYPE="Exclusive">

<CFSET StructDelete(Server, "CountuserActive")> </CFLOCK>

В ColdFusion существуют встроенные серверные переменные, приведенные в табл. 9.8.

Таблица 9.8. Встроенные серверные переменные

Наименование

Описание

Server . ColdFusion . ProductName Название продукта ColdFusion Server
Server. ColdFus ion. ProductVers ion Номер версии запущенного сервера, типа 5.0.0

Server . ColdFusion . ProductLevel

Уровень продукта, например Enterprise

Server . ColdFusion . SerialNumber

Последовательный номер, назначенный


при установке

Server . ColdFusion . Locales

Язык и регион поддерживаемый серве-


ром, например, English (US)

Server .OS. Name

Название операционной системы, например Windows NT

Server . OS . Addit ional Information

Дополнительная информация, обеспеченная операционной системой. Например, номер Service Pack

Server. OS .Version

Версия операционной системы, например 4.0

Server . OS . BuildNumber

Номер сборки, определенный операционной системой, типа 1381

Используйте серверные неременные, когда хотите организовать доступ к данной переменной из любого другого клиентского соединения вашего сервера. Не храните слишком большое количество серверных переменных.

В табл. 9.9 приведем сравнение переменных по различным характеристикам.

Таблица 9.9. Сравнение переменных

Тип переменной

Возможность блокировки

Способ хранения

Период жизненного цикла, по умолчанию

Client

Нет

Registry (Реестр) Cookie (Ячейка) Data Source (Источник данных)

10 дней 90 дней

Session

Да

ОЗУ сервера

20 минут

Application

Да

ОЗУ сервера

2 дня

Server

Да

ОЗУ сервера

До завершения работы




сервера

 

Просмотр переменных

В процессе разработки приложений достаточно часто необходимо просматривать значения объявленных переменных, и если для формирования CFML-страниц вы не используете редактор ColdFusion Studio, позволяющий отлаживать страницы посредством встроенного механизма, то для этих целей можно использовать программный метод просмотра существующих переменных.

Для отладки переменных можно применять тег <CFDUMP>, позволяющий наглядно демонстрировать значения простых переменных, запросов, массивов, структур и WDDX-переменных, созданных с помощью тега <CFWDDX>.

К примеру, вспомним код страницы my_line.cfm, детально описанной в главе 7 (см. листинг 7.1). Поместим в него следующую строку:

<CFDUMP var="#Cookie#">

Этим мы определим необходимость проверки всех существующих на странице ячеек (cookie).

Следующий пример позволяет создать список HTTP-заголовков для просмотра ИХ значений, используя функцию GetHttpRequestData() .

Листинг 9.1. Код страницы GetHttpRD.cfm

<HTML>

<HEAD>

<TITLE>GetHttpRequestData</TITLE>

<LINK rel="STYLESHEET" type="text/css" href="my__style.css">

</HEAD>

<BODY>

<CFSET HttpRData = GetHttpRequestData()> <CFOUTPUT>

<TABLE bgcolor="ElE1El" cellpadding = "0" cellspacing = "0"> <TR>

<TD bgcolor="666699" align="center" class="clTitle">

Name HTTP-Request</TD>

<TD bgcolor="666699" align="center" class="clTitle">

Value</TD> </TR>

<CFLOOP COLLECTION = #HttpRData.headers! ITEM = "http_name"> <TR>

<TD class="clText">#http_name#</td>

<TD class="clText">#StructFind(HttpRData.headers, http_name)#</td>

</TR> </CFLOOP>

</TABLE> </CFOUTPUT>

</BODY> </HTML>

Отметим лишь то, что в данном примере для функции GetHttpRequestData () мы использовали вхождение headers, что, собственно говоря, и позволило нам отфильтровать переменные HTTP-заголовков. Также эта функция предоставляет возможность использования вхождений content, method и protocol.

Проверка переменных

Одним из главных правил при работе с переменными является то, что прежде чем совершить какие-либо действия по отношению к той или иной переменной, необходимо произвести проверку наличия таковой. Мы уже не раз приводили примеры с использованием функции isDefined, позволяющей придерживаться данного правила. И все же еще раз обратим ваше внимание на пример, обеспечивающий проведение проверки в данном случае переменной Session.Login:

<CFIF IsDefined("Session.Login")>

Variable is present. <CFELSE>

Variable is absent. </CFIF>

Всегда ли мы уверены, что над переменной можно произвести ряд действий, требующих представления этой переменной в формате даты. Конечно же, нет. К примеру, вы предоставляете пользователю форму для ввода данных о себе с последующим занесением результата заполнения в базу данных, где одним из полей является день рождения. И далеко не всегда пользователь в состоянии с первого раза правильно заполнить данное поле, причем по разным причинам. Выходов из этого положения может быть несколько: контроль над полем на уровне JavaScript, размещение на форме ввода специальных инструментов типа "spinner", контролирующих ввод данных. Однако мы будем использовать возможности ColdFusion.

В следующем примере объявим переменную Form.BirtDayMyMam и тем самым подменим процесс ввода этой переменной. И уже на второй строке кода с помощью функции isDate проверим, можно ли преобразовать эту переменную, используя одну из функций по работе с датами (в нашем случае функция форматирования Даты — DateFormat):

<CFSET Form.BirthDayMyMam = "4-19-1940">

<CFIF IsDate(Form.BirthDayMyMam)> <CFOUTPUT>

#DateFormat(Form.BirthDayMyMam, "mmm-dd-yyyy")#

</CFOUTPUT> <CFELSE>

Return on the form of input

</CFIF>

Результатом данного примера является следующая строка:

Арr-19-1940

Вот еще один похожий пример, только уже позволяющий проверить в данном случае переменную Form.CostAduits на наличие числового формата. Здесь мы также подменяем процесс ввода на объявление переменной с использованием тега <CFSET>:

<CFSET Form.CostAduits = "17.9">

<CFIF IsNumeric(Form.CostAdults)>

<CFOUTPUT>

iNumberFormat(Form.CostAduits, '$___.__')#

</CFOUTPUT> <CFELSE>

Return on the form of input </CFIF>

В приведенном выше примере используется функция NumberFormat с необязательным параметром маски (mask), позволяющая форматировать числовые значения. И результатом этого примера является строка:

$ 17.90

Очередной пример позволяет нам определить, можно ли полученную переменную привести к логическому формату данных. И здесь мы воспользовались тегом <CFSET> для подмены процесса ввода переменной Form.MyYesNo:

<CFSET Form.MyYesNo = 1>

<CFIF IsBoolean(Form.MyYesNo)>

<CFOUTPUT>

#YesNoFormat(Form.MyYesNo)#

</CFOUTPUT> <CFELSE>

Return on the form of input </CFIF>

В приведенном выше примере используется функция YesNoFormat, позволяющая преобразовывать логическое значение или число к виду Yes или NO. Результатом этого примера является строка:

Yes

Следует отметить, что параметр функции isBooiean может быть как в виде числового, так и в виде символьного значения в отличие от предыдущих функций IsDate и isNumeric, где в качестве параметра должны присутствовать символьные значения. При значении параметра, равным нулю, False или NO функция IsBooiean возвращает False, в противном случае возвращается True.

В заключение представим полный код страницы signup.cfm, предназначенной для регистрации пользователя с применением вышеописанных функций, позволяющих контролировать ввод данных на уровне ColdFusion.

Листинг 9.2. Код страницы signup.cfm

<HTML> <HEAD>

<МЕТА name= "Author" content= "Ruben Akhayan">

<TITLE>Sing up</TITLE> <style type="text/css">

<! — .txt {

padding : Opx; font-weight : normal; font-family : Verdana, Geneva, Arial;

font-size : llpx; color : White; }

.txtError { padding : Opx; font-weight : normal; font-family : Verdana, Geneva, Arial; font-size : llpx; color : IFFCOCB; } INPUT {

padding : 0px;

font-weight : normal;

font-family : Verdana, Geneva, Arial;

font-size : llpx;

color : Blue;

}

.note {

color : #F5FFFA;

}

</style>

</HEAD>

<BODY bgcolor="<cfoutput>#application.BGColorPage#</cfoutput>">

<GFIF isDefined("Form.login_use")>

<CFSET DIsuccessful = 1>

<CFSET msgError = "Warning Error!">

<CFIF Len(Form.login_use) le 5>

<CFSET msgError = msgError &

"<br>Login should consist from more than 5 symbols">

<CFSET DIsuccessful = 0> </CFIF>

<CFIF Len(Form.pass_use) le 4>

<CFSET msgError = msgError &

"<br>Password should consist from more than 4 symbols">

<CFSET DIsuccessful = 0> </CFIF>

<CFIF IsNumeric(Form.pass_use)>

<CFSET msgError = msgError &

"<br>Password should not consist only of numbers">

<CFSET DIsuccessful = 0> </CFIF>

<CFIF Form.pass_use not equal Form.confirm>

<CFSET msgError = msgError &

"<br>Password and Confirm, should be identical">

<CFSET DIsuccessful = 0> </CFIF>

<CFIF Len(Form.fname_use) le 0>

<CFSET msgError = msgError &

"<br>First Name, should not be empty">

<CFSET DIsuccessful = 0> </CFIF>

<CFIF Len(Form.lname_use) le 0>

<CFSET msgError = msgError &

"<br>Last Name, should not be empty">

<CFSET DIsuccessful = 0> </CFIF>

<CFIF not IsDate(Form.bday use)>

<CFSET msgError = msgError &

"<br>Birthday, should have a format dd-mm-yyyy">

<CFSET DIsuccessful = 0> </CFIF>

<CFIF YesNoFormat(DIsuccessful) equal "No">

<CFSET login = IForm.login_use#>

<CFSET fname = fForm.fname_use#>

<CFSET Iname = ttForm.lname_use#>

<CFSET bday = #Form.bday_use#>

<CFSET email = IForm.email_use#>

<CFELSE>

<CFSET msgError=""> </CFIF>

<CFELSE>

<CFSET login=""> <CFSET fname="">

<CFSET lname=""> <CFSET bday="">

<CCFSET email=""> <CFSET msgError="">

<CFSET DIsuccessful = 0> </CFIF>

<CFIF YesNoFormat(DIsuccessful) equal "Yes">

<CFOUTPUT>

<p class="txt">

Data input successful<br>

Hi dear&nbsp;iForm.fname_usel&nbsp;#Form.lname_usei </p>

</CFOUTPUT> <CFELSE>

<FONT color="White"><h2>Sign up</h2></font>

<FORM action='signup.cfm' METHOD='POST' name='forml' >

<TABLE border='0' cellspacing='5' cellpadding='0'>

<TR> <TD colspan="2" align="center" class="txtError">

<CFOUTPUT>|msgError#</CFOOTPUT></TD></TR>

<TR><TD width='100' align="right" class="txt"> Login</td>

<td class="note"> <input name='login_use' size='17'

value="<CFOUTPUT>#login#</CFOUTPUT>">&nbsp;*</TD></TR>

<TR><TD align="right" class="txt"> Password</td>

<td class="note">

<input type='password' name='pass use'

size=' 17 ' >&nbsp; *</TD></TR>

<TR><TD align="right" class="txt"> Confirm</td><td class="note">

<input type='password' name='confirm'

size=' 17 ' >&nbsp; *</TD></TR>

<TR><TD align-"right" class="txt">

First Name</tdxtd class="note"> <input name='fname use' size='17'

value="<CFOUTPUT>#fnam#</CFOUTPUT>">&nbsp;*</TD></TR>

<TR><TD align="right" class="txt"> Last Name</td><td class="note">

<input name='lname_use' size='17'

value="<CFOUTPUT>#lname#</CFOUTPUT>">&nbsp;*</TD></TR>

<TR><TD align="right" class="txt"> Birthday</td>

<td class="note"> <input name='bday_use' size='10'

value="<CFOUTPUT>#bday</CFOUTPUT>">Snbsp;

dd-mra-yyyy&nbsp; *</TD></TR>

<TR><TD align="right" class="txt"> E-maiK/TD><TD class="note">

<input name='email_use' size='27'

value="<CFOUTPUT>#email#</CFOUTPUT>"></TD></TR>

<TR><TD align="right">

<input type=' submit' value='Send'></TD><TD>

<input type='reset' value='Clear' ></TD></TR>

</TABLE> </FORM> </CFIF>

</BODY> </HTML>

В приведенном выше примере мы использовали еще одну функцию — Len, позволяющую определить количество символов указанной переменной в качестве параметра. Что же касается занесения результатов регистрации в базу данных, то об этом поговорим в одной из следующих глав.

Резюме

Подведем итог. В данной главе использовались: